home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1998 November / Freeware November 1998.img / dist / fw_KLJxearth.idb / usr / freeware / src / xearth-1.0 / xearth.h.z / xearth.h
C/C++ Source or Header  |  1997-09-09  |  9KB  |  335 lines

  1. /*
  2.  * xearth.h
  3.  * kirk johnson
  4.  * july 1993
  5.  *
  6.  * RCS $Id: xearth.h,v 1.1 1995/11/21 18:59:42 swinokur Exp $
  7.  *
  8.  * Copyright (C) 1989, 1990, 1993, 1994, 1995 Kirk Lauritz Johnson
  9.  *
  10.  * Parts of the source code (as marked) are:
  11.  *   Copyright (C) 1989, 1990, 1991 by Jim Frost
  12.  *   Copyright (C) 1992 by Jamie Zawinski <jwz@lucid.com>
  13.  *
  14.  * Permission to use, copy, modify and freely distribute xearth for
  15.  * non-commercial and not-for-profit purposes is hereby granted
  16.  * without fee, provided that both the above copyright notice and this
  17.  * permission notice appear in all copies and in supporting
  18.  * documentation.
  19.  *
  20.  * Unisys Corporation holds worldwide patent rights on the Lempel Zev
  21.  * Welch (LZW) compression technique employed in the CompuServe GIF
  22.  * image file format as well as in other formats. Unisys has made it
  23.  * clear, however, that it does not require licensing or fees to be
  24.  * paid for freely distributed, non-commercial applications (such as
  25.  * xearth) that employ LZW/GIF technology. Those wishing further
  26.  * information about licensing the LZW patent should contact Unisys
  27.  * directly at (lzw_info@unisys.com) or by writing to
  28.  *
  29.  *   Unisys Corporation
  30.  *   Welch Licensing Department
  31.  *   M/S-C1SW19
  32.  *   P.O. Box 500
  33.  *   Blue Bell, PA 19424
  34.  *
  35.  * The author makes no representations about the suitability of this
  36.  * software for any purpose. It is provided "as is" without express or
  37.  * implied warranty.
  38.  *
  39.  * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  40.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
  41.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT
  42.  * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  43.  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
  44.  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  45.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  46.  */
  47.  
  48. #ifndef _XEARTH_H_
  49. #define _XEARTH_H_
  50.  
  51. #include <X11/Xos.h>
  52. #include <stdio.h>
  53. #include <stdlib.h>
  54. #include <math.h>
  55. #include <assert.h>
  56. #include <time.h>
  57. #include "port.h"
  58. #include "extarr.h"
  59. #include "kljcpyrt.h"
  60.  
  61. #define VersionString "1.0"
  62.  
  63. /* if NO_RANDOM is defined, use lrand48() and srand48() 
  64.  * instead of random() and srandom()
  65.  */
  66. #ifdef NO_RANDOM
  67. #define random()   lrand48()
  68. #define srandom(x) srand48((long) (x))
  69. #endif /* NO_RANDOM */
  70.  
  71. #ifndef M_PI
  72. #define M_PI 3.14159265358979323846
  73. #endif /* !M_PI */
  74.  
  75. /* a particularly large number
  76.  */
  77. #define BigNumber (1e6)
  78.  
  79. /* rotational period of the earth (seconds)
  80.  */
  81. #define EarthPeriod (86400)
  82.  
  83. /* types of pixels
  84.  */
  85. #define PixTypeSpace     (0)
  86. #define PixTypeLand      (1)
  87. #define PixTypeWater     (2)
  88. #define PixTypeStar      (3)
  89. #define PixTypeGridLand  (4)
  90. #define PixTypeGridWater (5)
  91.  
  92. /* types of dots
  93.  */
  94. #define DotTypeStar (0)
  95. #define DotTypeGrid (1)
  96.  
  97. /* types of viewing positions
  98.  */
  99. #define ViewPosTypeFixed  (0)
  100. #define ViewPosTypeSun    (1)
  101. #define ViewPosTypeOrbit  (2)
  102. #define ViewPosTypeRandom (3)
  103.  
  104. /* types of projections
  105.  */
  106. #define ProjTypeOrthographic (0)
  107. #define ProjTypeMercator     (1)
  108.  
  109. /* types of marker label alignment
  110.  */
  111. #define MarkerAlignDefault (0)
  112. #define MarkerAlignLeft    (1)
  113. #define MarkerAlignRight   (2)
  114. #define MarkerAlignAbove   (3)
  115. #define MarkerAlignBelow   (4)
  116.  
  117. /* vector rotation
  118.  */
  119. #define XFORM_ROTATE(p,vpi)             \
  120.  do {                                   \
  121.   double _p0_, _p1_, _p2_;              \
  122.   double _c_, _s_, _t_;                 \
  123.   _p0_ = p[0];                          \
  124.   _p1_ = p[1];                          \
  125.   _p2_ = p[2];                          \
  126.   _c_  = vpi.cos_lon;                   \
  127.   _s_  = vpi.sin_lon;                   \
  128.   _t_  = (_c_ * _p0_) - (_s_ * _p2_);   \
  129.   _p2_ = (_s_ * _p0_) + (_c_ * _p2_);   \
  130.   _p0_ = _t_;                           \
  131.   _c_  = vpi.cos_lat;                   \
  132.   _s_  = vpi.sin_lat;                   \
  133.   _t_  = (_c_ * _p1_) - (_s_ * _p2_);   \
  134.   _p2_ = (_s_ * _p1_) + (_c_ * _p2_);   \
  135.   _p1_ = _t_;                           \
  136.   _c_  = vpi.cos_rot;                   \
  137.   _s_  = vpi.sin_rot;                   \
  138.   _t_  = (_c_ * _p0_) - (_s_ * _p1_);   \
  139.   _p1_ = (_s_ * _p0_) + (_c_ * _p1_);   \
  140.   _p0_ = _t_;                           \
  141.   p[0] = _p0_;                          \
  142.   p[1] = _p1_;                          \
  143.   p[2] = _p2_;                          \
  144.  } while (0)
  145.  
  146. /* mercator projection (xyz->xy)
  147.  */
  148. #define MERCATOR_X(x, z)  (atan2((x), (z)))
  149. #define MERCATOR_Y(y)     (((y) >= 1) ? (BigNumber)      \
  150.                : (((y) <= -1) ? (-BigNumber) \
  151.                   : log(tan((asin(y)/2) + (M_PI/4)))))
  152. #define INV_MERCATOR_Y(y) (sin(2 * (atan(exp(y)) - (M_PI/4))))
  153.  
  154. /* xy->screen projections
  155.  */
  156. #define XPROJECT(x)     ((proj_scale*(x))+proj_xofs)
  157. #define YPROJECT(y)     (proj_yofs-(proj_scale*(y)))
  158. #define INV_XPROJECT(x) (((x)-proj_xofs)*inv_proj_scale)
  159. #define INV_YPROJECT(y) ((proj_yofs-(y))*inv_proj_scale)
  160.  
  161. #ifdef __alpha
  162. /* on alpha systems, trade off space for more efficient access
  163.  */
  164. typedef int      s8or32;
  165. typedef unsigned u8or32;
  166. typedef int      s16or32;
  167. typedef unsigned u16or32;
  168. #else
  169. /* other systems can access 8- and 16-bit items efficiently
  170.  */
  171. typedef char           s8or32;
  172. typedef unsigned char  u8or32;
  173. typedef short          s16or32;
  174. typedef unsigned short u16or32;
  175. #endif
  176.  
  177. typedef struct
  178. {
  179.   double cos_lat, sin_lat;    /* cos/sin of view_lat */
  180.   double cos_lon, sin_lon;    /* cos/sin of view_lon */
  181.   double cos_rot, sin_rot;    /* cos/sin of view_rot */
  182. } ViewPosInfo;
  183.  
  184. typedef struct
  185. {
  186.   short y;
  187.   short lo_x;
  188.   short hi_x;
  189.   short val;
  190. } ScanBit;
  191.  
  192. typedef struct
  193. {
  194.   short  x;
  195.   short  y;
  196.   u_char type;
  197. } ScanDot;
  198.  
  199. typedef struct
  200. {
  201.   float lat;
  202.   float lon;
  203.   char *label;
  204.   int   align;
  205. } MarkerInfo;
  206.  
  207. /* dither.c */
  208. extern int     dither_ncolors;
  209. extern u_char *dither_colormap;
  210. extern void    dither_setup _P((int));
  211. extern void    dither_row _P((u_char *, u16or32 *));
  212. extern void    dither_cleanup _P((void));
  213. extern void    mono_dither_setup _P((void));
  214. extern void    mono_dither_row _P((u_char *, u16or32 *));
  215. extern void    mono_dither_cleanup _P((void));
  216.  
  217. /* gif.c */
  218. extern void gif_output _P((void));
  219.  
  220. /* mapdata.c */
  221. extern short map_data[];
  222.  
  223. /* markers.c */
  224. extern MarkerInfo *marker_info;
  225. extern void        load_marker_info _P((char *));
  226. extern void        show_marker_info _P((char *));
  227.  
  228. /* ppm.c */
  229. extern void ppm_output _P((void));
  230.  
  231. /* render.c */
  232. extern void render _P((void (*)(u_char *)));
  233. extern void do_dots _P((void));
  234.  
  235. /* resources.c */
  236. extern char        *get_string_resource _P((const char *, const char *));
  237. extern int          get_boolean_resource _P((const char *, const char *));
  238. extern int          get_integer_resource _P((const char *, const char *));
  239. extern double       get_float_resource _P((const char *, const char *));
  240. extern unsigned int get_pixel_resource _P((const char *, const char *));
  241.  
  242. /* scan.c */
  243. extern ViewPosInfo view_pos_info;
  244. extern double      proj_scale;
  245. extern double      proj_xofs;
  246. extern double      proj_yofs;
  247. extern double      inv_proj_scale;
  248. extern ExtArr      scanbits;
  249. extern void        scan_map _P((void));
  250.  
  251. /* sunpos.c */
  252. extern void sun_position _P((time_t, double *, double *));
  253.  
  254. /* x11.c */
  255. extern void command_line_x _P((int, char *[]));
  256. extern void x11_output _P((void));
  257.  
  258. /* xearth.c */
  259. extern char  *progname;
  260. extern int    proj_type;
  261. extern double view_lon;
  262. extern double view_lat;
  263. extern double view_rot;
  264. extern double view_mag;
  265. extern int    do_shade;
  266. extern double sun_lon;
  267. extern double sun_lat;
  268. extern int    wdth;
  269. extern int    hght;
  270. extern int    shift_x;
  271. extern int    shift_y;
  272. extern int    do_stars;
  273. extern double star_freq;
  274. extern int    big_stars;
  275. extern int    do_grid;
  276. extern int    grid_big;
  277. extern int    grid_small;
  278. extern int    do_label;
  279. extern int    do_markers;
  280. extern char  *markerfile;
  281. extern int    wait_time;
  282. extern double time_warp;
  283. extern int    fixed_time;
  284. extern int    day;
  285. extern int    night;
  286. extern int    terminator;
  287. extern double xgamma;
  288. extern int    use_two_pixmaps;
  289. extern int    num_colors;
  290. extern int    do_fork;
  291. extern int    priority;
  292. extern time_t current_time;
  293.  
  294. extern void   compute_positions _P((void));
  295. extern char **tokenize _P((char *, int *, const char **));
  296. extern void   decode_proj_type _P((char *));
  297. extern void   decode_viewing_pos _P((char *));
  298. extern void   decode_sun_pos _P((char *));
  299. extern void   decode_size _P((char *));
  300. extern void   decode_shift _P((char *));
  301. extern void   xearth_bzero _P((char *, unsigned));
  302. extern void   version_info _P((void)) _noreturn;
  303. extern void   usage _P((const char *)) _noreturn;
  304. extern void   warning _P((const char *));
  305. extern void   fatal _P((const char *)) _noreturn;
  306.  
  307. #ifdef USE_EXACT_SQRT
  308.  
  309. #define SQRT(x) (((x) <= 0.0) ? (0.0) : (sqrt(x)))
  310.  
  311. #else
  312.  
  313. /*
  314.  * brute force approximation for sqrt() over [0,1]
  315.  *  - two quadratic regions
  316.  *  - returns zero for args less than zero
  317.  */
  318. #define SQRT(x)                                             \
  319.   (((x) > 0.13)                                             \
  320.    ? ((((-0.3751672414*(x))+1.153263483)*(x))+0.2219037586) \
  321.    : (((x) > 0.0)                                           \
  322.       ? ((((-9.637346154*(x))+3.56143)*(x))+0.065372935)    \
  323.       : (0.0)))
  324.  
  325. #endif /* USE_EXACT_SQRT */
  326.  
  327. #ifndef isupper
  328. # define isupper(c)  ((c) >= 'A' && (c) <= 'Z')
  329. #endif
  330. #ifndef _tolower
  331. # define _tolower(c)  ((c) - 'A' + 'a')
  332. #endif
  333.  
  334. #endif
  335.